[IA64] Fixed VTI domain destruction
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 22 Mar 2006 15:57:48 +0000 (08:57 -0700)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 22 Mar 2006 15:57:48 +0000 (08:57 -0700)
This patch fixed the VTI domain destruction processing.
I tested creation/destruction domU. The "domU" which I tested is
VTI domain and non VTI domain. There was not the memory leak
issue, and VTI domain is not left in a zombie state.

Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
xen/arch/ia64/vmx/vmmu.c
xen/arch/ia64/vmx/vmx_init.c
xen/arch/ia64/xen/dom0_ops.c
xen/arch/ia64/xen/domain.c
xen/include/asm-ia64/vmmu.h
xen/include/asm-ia64/vmx.h

index 1be237166d2ac23bda2f5f52111adccfe8629918..b19885f83eb0f8e9ec8ac6b21602d52c6fc23b88 100644 (file)
@@ -185,6 +185,20 @@ thash_cb_t *init_domain_tlb(struct vcpu *d)
     return tlb;
 }
 
+void free_domain_tlb(struct vcpu *v)
+{
+    struct page_info *page;
+    void *vhptbase;
+    thash_cb_t *tlb;
+
+    if ( v->arch.vtlb ) {
+        tlb = v->arch.vtlb;
+        vhptbase = (void*)((u64)tlb + sizeof (thash_cb_t)) - VCPU_VHPT_SIZE;
+        page = virt_to_page(vhptbase);
+        free_domheap_pages(page, VCPU_VHPT_ORDER);
+    }
+}
+
 /*
  * Insert guest TLB to machine TLB.
  *  data:   In TLB format
index 4db33d130087a926acf47f5a405fb7fcb3ed4b64..84ff3310b256c80182004a45e48ffb763335bfe9 100644 (file)
@@ -186,6 +186,13 @@ static vpd_t *alloc_vpd(void)
        return vpd;
 }
 
+/* Free vpd to xenheap */
+static void
+free_vpd(struct vcpu *v)
+{
+       if ( v->arch.privregs )
+               free_xenheap_pages(v->arch.privregs, get_order(VPD_SIZE));
+}
 
 /*
  * Create a VP on intialized VMX environment.
@@ -261,6 +268,8 @@ vmx_final_setup_guest(struct vcpu *v)
 {
        vpd_t *vpd;
 
+       free_xenheap_pages(v->arch.privregs, get_order(sizeof(mapped_regs_t)));
+
        vpd = alloc_vpd();
        ASSERT(vpd);
 
@@ -290,6 +299,17 @@ vmx_final_setup_guest(struct vcpu *v)
        set_bit(ARCH_VMX_INTR_ASSIST, &v->arch.arch_vmx.flags);
 }
 
+void
+vmx_relinquish_vcpu_resources(struct vcpu *v)
+{
+       vtime_t *vtm = &(v->arch.arch_vmx.vtm);
+
+       kill_timer(&vtm->vtm_timer);
+
+       free_domain_tlb(v);
+       free_vpd(v);
+}
+
 typedef struct io_range {
        unsigned long start;
        unsigned long size;
index 857f0ab76775bf4d6544b7cf947e2108f2fe4928..2ed4bb8aa7f5b524d0cc0da9db8856ae9a11bb53 100644 (file)
@@ -174,8 +174,11 @@ long arch_do_dom0_op(dom0_op_t *op, GUEST_HANDLE(dom0_op_t) u_dom0_op)
              */
             if ( (op->u.getmemlist.max_pfns == -1UL) &&
                  !test_bit(ARCH_VMX_CONTIG_MEM,
-                           &d->vcpu[0]->arch.arch_vmx.flags) )
-                return vmx_alloc_contig_pages(d) ? (-ENOMEM) : 0;
+                           &d->vcpu[0]->arch.arch_vmx.flags) ) {
+                ret = (long) vmx_alloc_contig_pages(d);
+                put_domain(d);
+                return ret ? (-ENOMEM) : 0;
+            }
 
             for ( i = start_page; i < (start_page + nr_pages); i++ )
             {
index 0deb58200fe08de91ba83723370e9c45e1a747de..372566f84b8b23f3f805a54e3e188f67a8ccb966 100644 (file)
@@ -211,8 +211,13 @@ struct vcpu *alloc_vcpu_struct(struct domain *d, unsigned int vcpu_id)
 
 void free_vcpu_struct(struct vcpu *v)
 {
-       if (v->arch.privregs != NULL)
-               free_xenheap_pages(v->arch.privregs, get_order(sizeof(mapped_regs_t)));
+       if (VMX_DOMAIN(v))
+               vmx_relinquish_vcpu_resources(v);
+       else {
+               if (v->arch.privregs != NULL)
+                       free_xenheap_pages(v->arch.privregs, get_order(sizeof(mapped_regs_t)));
+       }
+
        free_xenheap_pages(v, KERNEL_STACK_SIZE_ORDER);
 }
 
index d5194743625daa8f9fa44e79f24c010d77258bad..9d1ac34b49017c20c9c1218ce689a4fb7a148150 100644 (file)
@@ -373,6 +373,7 @@ extern void purge_machine_tc_by_domid(domid_t domid);
 extern void machine_tlb_insert(struct vcpu *d, thash_data_t *tlb);
 extern ia64_rr vmmu_get_rr(struct vcpu *vcpu, u64 va);
 extern thash_cb_t *init_domain_tlb(struct vcpu *d);
+extern void free_domain_tlb(struct vcpu *v);
 extern thash_data_t * vsa_thash(PTA vpta, u64 va, u64 vrr, u64 *tag);
 extern thash_data_t * vhpt_lookup(u64 va);
 extern void machine_tlb_purge(u64 va, u64 ps);
index 4674e9149d0259312b871f4559f18c95f421ecaf..c7eaf007a253a2d2561d3fac994a1ecb8cda833e 100644 (file)
@@ -51,7 +51,9 @@ extern void set_ifa_itir_iha (struct vcpu *vcpu, u64 vadr,
 extern void inject_guest_interruption(struct vcpu *vcpu, u64 vec);
 extern void vmx_intr_assist(struct vcpu *v);
 extern void set_illegal_op_isr (struct vcpu *vcpu);
-extern  void illegal_op (struct vcpu *vcpu);
+extern void illegal_op (struct vcpu *vcpu);
+extern void vmx_relinquish_vcpu_resources(struct vcpu *v);
+
 static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu)
 {
     return &((shared_iopage_t *)d->arch.vmx_platform.shared_page_va)->vcpu_iodata[cpu];